package cn.yl.fxboot.application.service.ffmpeg;

import java.util.ArrayList;
import java.util.List;

import cn.hutool.core.util.StrUtil;

public class FFmpegCommandBuilder {

	List<String> command = new ArrayList<>();

	public FFmpegCommandBuilder(String ffmpegPath) {
		command.add(ffmpegPath);
	}
	
	public FFmpegCommandBuilder add(String cmd) {
		command.add(cmd);
		return this;
	}
	
	public FFmpegCommandBuilder getAudio() {
		command.add("-vn");
		return this;
	}
	
	public FFmpegCommandBuilder cCopy() {
		command.add("-c");
		command.add("copy");
		return this;
	}
	
	public FFmpegCommandBuilder getVideo() {
		command.add("-an");
		return this;
	}
	
	public FFmpegCommandBuilder force() {
		command.add("-f");
		return this;
	}
	
	public FFmpegCommandBuilder safe0() {
		command.add("-safe");
		command.add("0");
		return this;
	}
	
	public FFmpegCommandBuilder concat() {
		command.add("concat");
		return this;
	}
	
	public FFmpegCommandBuilder h264ToTs() {
		command.add("-vbsf");
		command.add("h264_mp4toannexb");
		return this;
	}
	
	public FFmpegCommandBuilder adtsToAac() {
		command.add("-absf");
		command.add("aac_adtstoasc");
		return this;
	}
	
	/**
	 * 音频选项
	 * @return
	 */
	public FFmpegCommandBuilder acodec(String copy) {
		if(StrUtil.isNotBlank(copy)) {
			command.add("-acodec");
			command.add(copy);
		}
		return this;
	}
	
	/**
	 * 音频采样率
	 * @return
	 */
	public FFmpegCommandBuilder ar(String ar) {
		if(StrUtil.isNotBlank(ar)) {
			command.add("-r");
			command.add(ar);
		}
		return this;
	}
	
	
	/**
	 * 音频Copy
	 * @return
	 */
	public FFmpegCommandBuilder acodecCopy() {
		command.add("-acodec");
		command.add("copy");
		return this;
	}
	
	/**
	 * 视频Copy
	 * @return
	 */
	public FFmpegCommandBuilder vcodecCopy() {
		command.add("-vcodec");
		command.add("copy");
		return this;
	}
	/**
	 * 视频选项
	 * @param copy
	 * @return
	 */
	public FFmpegCommandBuilder vcodec(String copy) {
		if(StrUtil.isNotBlank(copy)) {
			command.add("-vcodec");
			command.add(copy);
		}
		return this;
	}

	/**
	 * 添加输入文件的路径
	 *
	 * @param inputFilePath
	 */
	public FFmpegCommandBuilder input(String inputFilePath) {
		if (inputFilePath != null) {
			command.add("-i");
			command.add(inputFilePath);
		}
		return this;
	}

	/**
	 * 添加输出文件的路径
	 *
	 * @param outputFilePath
	 */
	public FFmpegCommandBuilder output(String outputFilePath) {
		if (outputFilePath != null) {
			command.add(outputFilePath);
		}
		return this;
	}

	/**
	 * 覆盖输出文件
	 */
	public FFmpegCommandBuilder override() {
		command.add("-y");
		return this;
	}

	/**
	 * 强制输出格式
	 *
	 * @param format 输出格式
	 */
	public FFmpegCommandBuilder format(FFmpegCommandFormatEnum format) {
		if (format != null) {
			command.add("-f");
			command.add(format.getValue());
		}
		return this;
	}

	/**
	 * 设置录制/转码的时长
	 *
	 * @param duration 形如 0.001 表示0.001秒，hh:mm:ss[.xxx]格式的记录时间也支持
	 */
	public FFmpegCommandBuilder duration(String duration) {
		if (duration != null) {
			command.add("-t");
			command.add(duration);
		}
		return this;
	}

	/**
	 * 搜索到指定的起始时间
	 *
	 * @param position 形如 17 表示17秒，[-]hh:mm:ss[.xxx]的格式也支持
	 */
	public FFmpegCommandBuilder position(String position) {
		if (position != null) {
			command.add("-ss");
			command.add(position);
		}
		return this;
	}

	/**
	 * 设置帧大小
	 *
	 * @param size 形如 xxx*xxx
	 * @return
	 */
	public FFmpegCommandBuilder size(String size) {
		if (size != null) {
			command.add("-s");
			command.add(size);
		}
		return this;
	}

	/**
	 * 创建FFmpegCommand命令封装类
	 *
	 * @return FFmpegCommand
	 */
	public FFmpegCommand build() {
		return new FFmpegCommand(command);
	}


}
